package cn.xumaoyang.order.service.impl;
import cn.xumaoyang.basic.service.impl.BaseServiceImpl;
import cn.xumaoyang.basic.util.CodeGenerateUtils;
import cn.xumaoyang.basic.util.PageList;
import cn.xumaoyang.order.domain.AdoptOrder;
import cn.xumaoyang.order.domain.OrderAddress;
import cn.xumaoyang.order.mapper.AdoptOrderMapper;
import cn.xumaoyang.order.mapper.OrderAddressMapper;
import cn.xumaoyang.order.query.AdoptOrderQuery;
import cn.xumaoyang.order.service.IAdoptOrderService;
import cn.xumaoyang.org.domain.Employee;
import cn.xumaoyang.org.mapper.EmployeeMapper;
import cn.xumaoyang.pay.service.IPayBillService;
import cn.xumaoyang.pet.domain.Pet;
import cn.xumaoyang.pet.mapper.PetMapper;
import cn.xumaoyang.user.domain.Logininfo;
import cn.xumaoyang.user.domain.User;
import cn.xumaoyang.user.domain.UserAddress;
import cn.xumaoyang.user.mapper.UserAddressMapper;
import cn.xumaoyang.user.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.Map;

@Service
public class AdoptOrderServiceImpl extends BaseServiceImpl<AdoptOrder> implements IAdoptOrderService {


    //在yml里面配置的超时时间,会自动解析yml。
    @Value("${order.time.out}")
    private Long timeOut;

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private PetMapper petMapper;

    @Autowired
    private EmployeeMapper employeeMapper;

    //为了保存。
    @Autowired
    private AdoptOrderMapper adoptOrderMapper;

    //为了查询地址。
    @Autowired
    private UserAddressMapper userAddressMapper;

    //为了保存地址。
    @Autowired
    private OrderAddressMapper orderAddressMapper;

    //为了支付调用pay里面service
    @Autowired
    private IPayBillService payBillService;


   //领养订单。
    @Override
    @Transactional //事务。
    public String submit(Map<String, Object> params, Logininfo currentLoginInfo) {
        //强转推荐使用Long.valueOf里面参数后.toString.
        Integer serviceMethod = Integer.valueOf(params.get("service_method").toString());
        Long addressId = Long.valueOf(params.get("address_id").toString());  //地址来自于哪里。
        Long payMethod = Long.valueOf(params.get("pay_method").toString());  //1 支付宝 2 微信 3 银联 0其它
        Long petId = Long.valueOf(params.get("pet_id").toString());
        //获取登录人
        User user = userMapper.loadByLoginfoId(currentLoginInfo.getId());
        //获取pet，用来设置下架和时间。
        Pet pet = petMapper.loadById(petId);
        //设置下架宠物。
        pet.setState(0);  //0下架。1上架。
        //设置下架时间
        pet.setOffsaletime(new Date());
        //绑定领养人。
        pet.setUser_id(user.getId());
        //修改保存。
        petMapper.update(pet);

        //生成领养订单。
        AdoptOrder order = initgetAdoptOrder(user, pet); //抽取代码。
        //保存。
        adoptOrderMapper.add(order); //需返回自增id。

        //收获地址。
        UserAddress userAddress = userAddressMapper.loadById(addressId);
        //抽取的代码。
        OrderAddress orderAddress = initgetOrderAddress(order, userAddress);
        //保存。
        orderAddressMapper.add(orderAddress);
        //生成支付单。
        return payBillService.pay(order,payMethod);//传入订单和支付方式
    }

    //用户个人领养订单。
    @Override
    public PageList<AdoptOrder> user(AdoptOrderQuery query, Logininfo currentLoginInfo) {
        //根据当前登录人获取到全部信息。
        User user = userMapper.loadByLoginfoId(currentLoginInfo.getId());
        //设置当前登录人是用户还是管理员。
        query.setUserId(user.getId());
        return super.queryPage(query);
    }

    //管理员领养订单。
    @Override
    public PageList<AdoptOrder> admin(AdoptOrderQuery query, Logininfo currentLoginInfo) {
        //根据当前登录人获取到全部信息。
        Employee employee = employeeMapper.loadByLoginInfoId(currentLoginInfo.getId());
        if (employee.getShop_id() != null){
            //设置当前登录人是用户还是管理员。
            query.setShopId(employee.getId());
        }
        return super.queryPage(query);
    }






    //抽取的代码。
    private OrderAddress initgetOrderAddress(AdoptOrder order, UserAddress userAddress) {
        OrderAddress orderAddress = new OrderAddress();
        //拷贝。
        BeanUtils.copyProperties(userAddress,orderAddress);
        //设置值。
        orderAddress.setOrder_id(order.getId());
        orderAddress.setOrderSn(order.getOrderSn());
        return orderAddress;
    }
    //抽取的代码。
    private AdoptOrder initgetAdoptOrder(User user, Pet pet) {
        AdoptOrder order = new AdoptOrder();
        //领养订单。    //可读性太差，抽取这部分代码，快捷键，AIT+SHIFT+M
        order.setDigest("[摘要]对"+pet.getName()+"收购订单！");
        order.setState(0);//待支付
        order.setPrice(pet.getCostprice());
        String orderSn = CodeGenerateUtils.generateOrderSn(user.getId());
        order.setOrderSn(orderSn);
        order.setPaySn(CodeGenerateUtils.generateUnionPaySn());
        order.setPet_id(pet.getId());
        order.setUser_id(user.getId());
        order.setShop_id(pet.getShop_id());
//        private Date lastPayTime;    最后支付时间。
//        private Date lastConfirmTime;  最后确认时间。
        //这里设置的值为yml里面的配置。
        order.setLastPayTime(new Date(System.currentTimeMillis() + timeOut ));
        return order;
    }
}
